﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESEMLFramework;
using DocumentGenerator.Document;
using iTextSharp.text;
using System.IO;

namespace ESEMLFramework
{
    public partial class MainForm : Form
    {
        private ControlledExperiment controlledExperiment;

        public ControlledExperiment ControlledExperiment
        {
            get { return controlledExperiment; }
            set { controlledExperiment = value; }
        }

        public MainForm()
        {
            InitializeComponent();
        }

        public MainForm(ControlledExperiment controlledExperiment)
        {
            InitializeComponent();
            this.controlledExperiment = controlledExperiment;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            String retorno = String.Empty;
            try
            {
                DocumentESEML documento = new DocumentESEML(@"C:\Users\Dhiego\Documents\tmpteste.pdf");

                documento.Open();

                //criando capa
                documento.AddCover(this.controlledExperiment.Name, this.controlledExperiment.Description);

                Chapter objetivos = documento.AddChapter("Definicao dos Objetivos");

                documento.AddParagraph("As seções que seguem apresentam os objetivos desse estudo experimental.", 12);

                //Objetivos
                List<Metric> metricas = new List<Metric>();
                foreach (Goal g in controlledExperiment.Goals)
                {
                    documento.AddSection(objetivos, g.Description);
                    List list = new List(List.UNORDERED);
                    foreach (Question q in g.Questions)
                    {
                        list.Add(new ListItem(new Chunk(q.Description, new Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 12, iTextSharp.text.Font.NORMAL))));
                        foreach(Metric m in q.Metrics)
                            metricas.Add(m);
                    }
                    if (list.Size > 0)
                        documento.AddList(list);
                }

                //Metricas
                documento.AddSection(objetivos, "Métricas");
                List metricaItens = new List(List.UNORDERED);
                foreach (Metric m in metricas)
                {
                    metricaItens.Add(new ListItem(new Chunk(m.Description, new Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 12, iTextSharp.text.Font.NORMAL))));
                }
                if (metricaItens.Size > 0)
                    documento.AddList(metricaItens);


                //Hipoteses
                Chapter planejamento = documento.AddChapter("Planejamento");
                documento.AddParagraph("Essa seção descreve o plano de experimento evidenciando como o mesmo foi projetado. Isso permite a execução de outros experimento utilizando o mesmo plano, o que poderia confirmar nossos resultados e derivar novos.", 12);
                documento.AddSection(planejamento, "Definição de hipóteses");
                foreach (Hypothesis h in controlledExperiment.Hypothesis)
                {
                    documento.AddChunk(h.Name + ": ", 12, 1);
                    documento.AddChunk(h.Description, 12, 0);
                }

                //Tratamentos - TO DO!
                documento.AddSection(planejamento, "Tratamento");
                foreach (Factor f in controlledExperiment.Factors)
                {
                    foreach (Treatment t in f.Treatments)
                        documento.AddParagraph(t.Description, 12);
                }


                //Objeto Experimental
                documento.AddSection(planejamento, "Objeto Experimental");
                documento.AddParagraph(controlledExperiment.ObjectCE.Description, 12);

                //Participantes
                documento.AddSection(planejamento, "Participantes");
                documento.AddParagraph(controlledExperiment.Subject.Description, 12);
                    

                //Variaveis dependentes OU independentes - Verificar isso!
                Section variaveisDependentes = documento.AddSection(planejamento, "Variáveis Dependentes");
                documento.AddParagraph("Essa subção apresenta as variáveis que servirão de entrada para o experimento, sejam elas constantes, no caso dos parâmetros, ou apresentando múltiplos tratamentos, no caso dos fatores.", 12);
                foreach (DependentVariable d in controlledExperiment.DependentVariables)
                { 
                   //verificar modelagem das variaveis dependentes e independentes!
                }

                //Parâmetros
                documento.AddSubSection(variaveisDependentes, "Parâmetros");
                foreach (Parameter p in controlledExperiment.Parameters)
                {
                    documento.AddChunk(p.Name + ": ", 12, 1);
                    documento.AddChunk(p.Description, 12, 0);
                }

                //Fatores
                documento.AddSubSection(variaveisDependentes, "Fatores");
                foreach (Factor f in controlledExperiment.Factors)
                {
                    documento.AddChunk(f.Name + ": ", 12, 1);
                    documento.AddChunk(f.Description, 12, 0);
                }


                //Design do experimento
                documento.AddSubSection(variaveisDependentes, "Design do experimento");
                documento.AddParagraph(controlledExperiment.Design.Description, 12);

                //Preparação ???

                //Análise ???

                //Validade do experimento

                Chapter validade = documento.AddChapter("Validade do Experimento");
                documento.AddParagraph("Essa seção discute o quão válidos são os resultados desse experimento.", 12);

                foreach (Validity v in controlledExperiment.Validities)
                {
                    documento.AddSection(validade, v.Description);
                }

                retorno = "1";
                //Fecha o documento
                documento.Close();
            }
            catch (DocumentException de)
            {
                retorno = de.Message;
            }
            catch (IOException ioe)
            {
                retorno = ioe.Message;
            }
            catch (Exception ex)
            {
                retorno = ex.Message;
            }
            finally
            {
                if(retorno != "1")
                    MessageBox.Show(retorno);
                if (retorno.Equals("1"))
                    System.Diagnostics.Process.Start(@"C:\Users\Dhiego\Documents\tmpteste.pdf");
            }

        }

    }
}
